package com.bsth.entity.schedule;

import com.bsth.entity.Line;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import org.apache.commons.lang3.BooleanUtils;

import javax.persistence.*;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 排班计划。
 */
@Entity
@Table(name = "bsth_c_s_sp")
@NamedEntityGraphs({
        @NamedEntityGraph(name = "schedulePlan_xl", attributeNodes = {
            @NamedAttributeNode("xl"),
        })
})
@JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"})
public class SchedulePlan extends BEntity {

    /** 主键Id */
    @Id
    @GeneratedValue
    private Long id;

    /** 关联的线路 */
    @ManyToOne(optional = false, cascade = CascadeType.DETACH, fetch = FetchType.LAZY)
    private Line xl;

    /** 排班计划的开始时间 */
    @Column(nullable = false)
    private Date scheduleFromTime;
    /** 排班计划的结束时间 */
    @Column(nullable = false)
    private Date scheduleToTime;

    /** 使用的时刻表名字列表（用逗号连接） */
    private String ttInfoNames;
    /** 使用的时刻表id列表（用逗号连接） */
    private String ttInfoIds;

    /** 是否 排班计划优先 */
    private Boolean isHistoryPlanFirst;

    /** 每次排班的结果数据（错误，正确提示都在这里） */
    @Column(length = 2000)
    private String planResult;

    @JsonIgnore
    /** 使用中间表的一对多关联 明细信息 */
    @OneToMany(mappedBy = "schedulePlan", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<SchedulePlanInfo> schedulePlanInfoList = new ArrayList<>();


    public static String generateInsertSql() {
        String sql = "insert into bsth_c_s_sp " +
                " (xl, schedule_from_time, schedule_to_time, " +
                "tt_info_names, tt_info_ids, is_history_plan_first, plan_result, " +
                "create_by, update_by, create_date, update_date) " +
                "values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        return sql;
    }

    public void preparedStatementSet(PreparedStatement ps) throws SQLException {
        ps.setInt(1, this.xl.getId());
        ps.setDate(2, new java.sql.Date(this.scheduleFromTime.getTime()));
        ps.setDate(3, new java.sql.Date(this.scheduleToTime.getTime()));
        ps.setString(4, this.ttInfoNames);
        ps.setString(5, this.ttInfoIds);
        ps.setInt(6, BooleanUtils.isTrue(this.isHistoryPlanFirst) ? 1 : 0);
        ps.setString(7, this.planResult);
        ps.setInt(8, this.getCreateBy().getId());
        ps.setInt(9, this.getUpdateBy().getId());
        ps.setTimestamp(10, new java.sql.Timestamp(this.getCreateDate().getTime()));
        ps.setTimestamp(11, new java.sql.Timestamp(this.getUpdateDate().getTime()));
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Line getXl() {
        return xl;
    }

    public void setXl(Line xl) {
        this.xl = xl;
    }

    public Date getScheduleFromTime() {
        return scheduleFromTime;
    }

    public void setScheduleFromTime(Date scheduleFromTime) {
        this.scheduleFromTime = scheduleFromTime;
    }

    public Date getScheduleToTime() {
        return scheduleToTime;
    }

    public void setScheduleToTime(Date scheduleToTime) {
        this.scheduleToTime = scheduleToTime;
    }

    public List<SchedulePlanInfo> getSchedulePlanInfoList() {
        return schedulePlanInfoList;
    }

    public void setSchedulePlanInfoList(List<SchedulePlanInfo> schedulePlanInfoList) {
        this.schedulePlanInfoList = schedulePlanInfoList;
    }

    public String getTtInfoNames() {
        return ttInfoNames;
    }

    public void setTtInfoNames(String ttInfoNames) {
        this.ttInfoNames = ttInfoNames;
    }

    public String getTtInfoIds() {
        return ttInfoIds;
    }

    public void setTtInfoIds(String ttInfoIds) {
        this.ttInfoIds = ttInfoIds;
    }

    public Boolean getIsHistoryPlanFirst() {
        return isHistoryPlanFirst;
    }

    public void setIsHistoryPlanFirst(Boolean isHistoryPlanFirst) {
        this.isHistoryPlanFirst = isHistoryPlanFirst;
    }

    public String getPlanResult() {
        return planResult;
    }

    public void setPlanResult(String planResult) {
        this.planResult = planResult;
    }
}
